/*
 * @Author: lei
 * @Description: 常用api汇总，其余的查文档
 * @FilePath: /code/concurrency/all_api.cc
 */

#include <thread>
#include <chrono>
#include <iostream>
#include <mutex>
#include <condition_variable>
#include <future>

int Sum(int c)
{
    int sum=0;//局部变量初始值为随机值
    for(int i=0;i<=c;i++)
        sum+=i;
    return sum;
}

int main()
{
    //thread
    std::thread th(Sum,6);//更多构造方式，使用可调用对象，参考thread.cc
    //if(th.joinable) th.join();
    //th.detach();
    std::cout<< "th.get_id()=" << th.get_id() << std::endl;
    std::cout << "std::thread::hardware_concurrency()= " << std::thread::hardware_concurrency() << std::endl;

    //this_thread命名空间
    std::cout << "std::this_thread::get_id()= " << std::this_thread::get_id() << std::endl;
    //std::this_thread::yield();
    
    //mutex
    std::mutex mu;
    std::mutex mu2;
    mu.lock();
    mu.try_lock();
    mu.unlock();
    {
        std::lock_guard lk(mu);
    }
    std::lock(mu,mu2);//采用了死锁避免算法，一次分配所有资源
    {
        std::unique_lock uk(mu,std::adopt_lock);//更灵活，可以多次手动加锁或解锁
        //mu.lock();
    }
    {
        std::unique_lock uk(mu2,std::defer_lock);//更灵活，可以多次手动加锁或解锁
        mu.lock();
    }

    //condition_variable
    std::condition_variable cond;
    cond.notify_all();
    cond.notify_one();
    //cond.wait(lk);//先解锁，后加锁的过程,需要unique_lock包装过的互斥量


    //promise和future
    std::promise<int> p;
    std::future<int> f=p.get_future();

    //async
    std::future<int> fu=std::async(std::launch::async,Sum,6);
    std::cout << fu.get() <<std::endl;
    //fu.wait()等

    //packaged_task
    std::packaged_task<int(int)> pt(Sum);
    pt(5);
    std::future<int> fut=pt.get_future();

    th.join();
}
/*返回future对象的三种方式
*1.promise 的get_future函数
*2.packaged_task的get_future函数
*3.std::async返回一个future
*/